﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    public class EventBus : IEventBus
    {
        private readonly Dictionary<Type, List<object>> _handlers = new();
        public void Subscribe<T>(IEventHandler<T> handler)
        {
            if (!_handlers.ContainsKey(typeof(T)))
            {
                _handlers[typeof(T)] = new List<object>();
            }
            _handlers[typeof(T)].Add(handler);
        }
        public void Unsubscribe<T>(IEventHandler<T> handler)
        {
            if (_handlers.ContainsKey(typeof(T)))
            {
                _handlers[typeof(T)].Remove(handler);
            }
        }
        public async Task Publish<T>(T eventMessage)
        {
            if (_handlers.ContainsKey(typeof(T)))
            {
                var tasks = _handlers[typeof(T)].Cast<IEventHandler<T>>()
                    .Select(handler => handler.Handle(eventMessage));
                await Task.WhenAll(tasks);
            }
        }
    }
    //public class EventBus : IEventBus
    //{
    //    //这里使用字典来模拟事件的订阅和发布
    //    private readonly Dictionary<Type, List<Delegate>> _handlers = new();
    //    public void Publish(IntegrationEvent @event)
    //    {
    //        if (_handlers.TryGetValue(@event.GetType(), out var handlers))
    //        {
    //            foreach (var handler in handlers)
    //            {
    //                var concreteHandler = handler.DynamicInvoke(@event) as Task;
    //                if (concreteHandler != null)
    //                {
    //                    concreteHandler.Wait();
    //                }
    //            }
    //        }
    //    }

    //    public void Subscribe<TEvent, THandler>() where TEvent : IntegrationEvent where THandler : IIntegrationEventHandler<TEvent>
    //    {
    //        if (!_handlers.TryGetValue(typeof(TEvent), out var handlers))
    //        {
    //            handlers = new List<Delegate>();
    //            _handlers[typeof(TEvent)] = handlers;
    //        }

    //        var handler = Activator.CreateInstance<THandler>;
    //        var methodInfo = typeof(THandler).GetMethod("Handle");
    //        if (methodInfo != null)
    //        {
    //            /*
    //            使用指定的第一个参数创建指定类型的委托，该委托表示指定的静态或实例方法。

    //            要创建的委托类型
    //            委托绑定到的对象，或null将方法视为静态（在Visual Basic中为Shared）。
    //            MethodInfo描述委托要表示的静态或实例方法
    //            */
    //            /*
    //            error：无法绑定到目标方法，因为其签名与委托类型的签名不兼容。 
    //            */
    //            var handlerDelegate = Delegate.CreateDelegate(typeof(Action<TEvent>), handler, methodInfo);
    //            handlers.Add(handlerDelegate);
    //        }
    //    }

    //    public void Unsubscribe<TEvent, THandler>() where TEvent : IntegrationEvent where THandler : IIntegrationEventHandler<TEvent>
    //    {
    //        //简化处理，实际使用中可能需要更复杂的逻辑来取消订阅
    //        _handlers.Remove(typeof(TEvent));
    //    }

    //}
}
